5.06. Встроенные функции в C++
Встроенные функции в C++
В языке C++ отсутствуют встроенные функции в классическом понимании интерпретируемых языков. Основу функциональности составляют функции стандартной библиотеки C и C++, а также компиляторные внутренние функции. Справочник охватывает наиболее часто применяемые утилиты, сгруппированные по категориям использования.
Управление выполнением программы
| Функция | Значение | Пример |
|---|---|---|
exit | Немедленное завершение программы с возвратом кода состояния операционной системе | exit(EXIT_SUCCESS); |
abort | Аварийное завершение программы без вызова деструкторов объектов | abort(); |
atexit | Регистрация функции для вызова при нормальном завершении программы | atexit(cleanup_function); |
quick_exit | Быстрое завершение программы с минимальной очисткой ресурсов | quick_exit(EXIT_FAILURE); |
at_quick_exit | Регистрация функции для вызова при быстром завершении программы | at_quick_exit(log_shutdown); |
Работа с памятью
| Функция | Значение | Пример |
|---|---|---|
malloc | Выделение блока памяти указанного размера без инициализации | void* ptr = malloc(100); |
calloc | Выделение и обнуление блока памяти для заданного количества элементов | int* arr = (int*)calloc(10, sizeof(int)); |
realloc | Изменение размера ранее выделенного блока памяти | ptr = realloc(ptr, 200); |
free | Освобождение ранее выделенного блока памяти | free(ptr); |
memcpy | Копирование байтов из одного блока памяти в другой | memcpy(dest, src, size); |
memmove | Копирование байтов с корректной обработкой перекрывающихся областей | memmove(dest, src, size); |
memset | Заполнение блока памяти заданным значением | memset(buffer, 0, 1024); |
Математические функции
| Функция | Значение | Пример |
|---|---|---|
abs | Вычисление абсолютного значения целого числа | int x = abs(-42); |
fabs | Вычисление абсолютного значения числа с плавающей точкой | double y = fabs(-3.14); |
sqrt | Вычисление квадратного корня | double r = sqrt(16.0); |
pow | Возведение числа в степень | double p = pow(2.0, 8.0); |
sin | Вычисление синуса угла в радианах | double s = sin(M_PI / 2); |
cos | Вычисление косинуса угла в радианах | double c = cos(0.0); |
tan | Вычисление тангенса угла в радианах | double t = tan(M_PI / 4); |
log | Вычисление натурального логарифма | double l = log(2.71828); |
log10 | Вычисление десятичного логарифма | double d = log10(1000.0); |
ceil | Округление числа вверх до ближайшего целого | double u = ceil(3.14); |
floor | Округление числа вниз до ближайшего целого | double d = floor(3.99); |
round | Округление числа до ближайшего целого по правилам математики | double r = round(3.5); |
Строковые функции
| Функция | Значение | Пример |
|---|---|---|
strlen | Определение длины нуль-терминированной строки | size_t len = strlen("hello"); |
strcpy | Копирование одной строки в другую | strcpy(dest, "source"); |
strncpy | Копирование с ограничением максимального количества символов | strncpy(dest, src, 10); |
strcat | Конкатенация двух строк | strcat(dest, " suffix"); |
strncat | Конкатенация с ограничением количества добавляемых символов | strncat(dest, src, 5); |
strcmp | Сравнение двух строк лексикографически | int cmp = strcmp(a, b); |
strncmp | Сравнение с ограничением количества сравниваемых символов | int cmp = strncmp(a, b, 3); |
strchr | Поиск первого вхождения символа в строке | char* p = strchr(str, 'a'); |
strstr | Поиск подстроки внутри строки | char* p = strstr(haystack, needle); |
atoi | Преобразование строки в целое число | int n = atoi("42"); |
atof | Преобразование строки в число с плавающей точкой | double d = atof("3.14"); |
Ввод и вывод данных
| Функция | Значение | Пример |
|---|---|---|
printf | Форматированный вывод данных в стандартный поток | printf("Value: %d\n", 42); |
scanf | Форматированный ввод данных из стандартного потока | scanf("%d", &value); |
fprintf | Форматированный вывод в файловый поток | fprintf(file, "Error: %s", msg); |
fscanf | Форматированный ввод из файлового потока | fscanf(file, "%d", &value); |
sprintf | Форматированный вывод в строковый буфер | sprintf(buffer, "ID: %04d", id); |
snprintf | Безопасный форматированный вывод с ограничением длины | snprintf(buf, size, "Data: %s", input); |
fopen | Открытие файла для чтения или записи | FILE* f = fopen("data.txt", "r"); |
fclose | Закрытие ранее открытого файла | fclose(file); |
fread | Чтение блока данных из файла | fread(buffer, 1, 1024, file); |
fwrite | Запись блока данных в файл | fwrite(data, sizeof(int), 10, file); |
fflush | Сброс буфера вывода на устройство | fflush(stdout); |
Функции преобразования и утилиты
| Функция | Значение | Пример |
|---|---|---|
sizeof | Оператор определения размера типа или объекта в байтах | size_t s = sizeof(int); |
typeid | Получение информации о типе во время выполнения | const type_info& ti = typeid(obj); |
offsetof | Вычисление смещения поля внутри структуры | size_t off = offsetof(struct_t, field); |
qsort | Сортировка массива с использованием пользовательской функции сравнения | qsort(arr, 10, sizeof(int), compare); |
bsearch | Бинарный поиск элемента в отсортированном массиве | void* p = bsearch(key, arr, 10, sizeof(int), compare); |
time | Получение текущего календарного времени | time_t now = time(NULL); |
clock | Измерение процессорного времени выполнения программы | clock_t start = clock(); |
rand | Генерация псевдослучайного целого числа | int r = rand() % 100; |
srand | Инициализация генератора псевдослучайных чисел | srand(time(NULL)); |
Функции и методы стандартной библиотеки C++ (STL)
Контейнеры: общие методы
| Метод | Значение | Пример |
|---|---|---|
size | Возвращает количество элементов в контейнере | size_t n = vec.size(); |
empty | Проверяет, пуст ли контейнер | if (vec.empty()) { /* ... */ } |
clear | Удаляет все элементы из контейнера | vec.clear(); |
begin | Возвращает итератор на первый элемент | auto it = vec.begin(); |
end | Возвращает итератор на позицию после последнего элемента | auto it = vec.end(); |
front | Доступ к первому элементу контейнера | int first = vec.front(); |
back | Доступ к последнему элементу контейнера | int last = vec.back(); |
Вектор и динамические массивы
| Функция / метод | Значение | Пример |
|---|---|---|
vector | Шаблонный класс динамического массива | std::vector<int> v; |
push_back | Добавление элемента в конец вектора | v.push_back(42); |
pop_back | Удаление последнего элемента вектора | v.pop_back(); |
resize | Изменение размера вектора | v.resize(100); |
reserve | Резервирование памяти без изменения размера | v.reserve(1000); |
capacity | Текущая ёмкость выделенной памяти | size_t cap = v.capacity(); |
shrink_to_fit | Сокращение ёмкости до размера контейнера | v.shrink_to_fit(); |
Строки и строковые операции
| Функция / метод | Значение | Пример |
|---|---|---|
string | Класс для работы со строками | std::string s = "text"; |
length | Возвращает длину строки | size_t len = s.length(); |
substr | Извлечение подстроки | std::string sub = s.substr(0, 4); |
find | Поиск подстроки или символа | size_t pos = s.find("abc"); |
replace | Замена части строки | s.replace(0, 3, "new"); |
append | Добавление текста в конец строки | s.append(" more"); |
c_str | Получение указателя на C-строку | const char* p = s.c_str(); |
to_string | Преобразование числа в строку | std::string num = std::to_string(42); |
stoi | Преобразование строки в целое число | int n = std::stoi("42"); |
stod | Преобразование строки в число с плавающей точкой | double d = std::stod("3.14"); |
Алгоритмы стандартной библиотеки
| Функция | Значение | Пример |
|---|---|---|
sort | Сортировка диапазона элементов | std::sort(vec.begin(), vec.end()); |
reverse | Разворот последовательности | std::reverse(arr, arr + n); |
find | Поиск значения в диапазоне | auto it = std::find(v.begin(), v.end(), 42); |
count | Подсчёт вхождений значения | int c = std::count(v.begin(), v.end(), 5); |
copy | Копирование диапазона | std::copy(src, src + n, dest); |
fill | Заполнение диапазона значением | std::fill(arr, arr + 10, 0); |
max_element | Поиск максимального элемента | auto it = std::max_element(v.begin(), v.end()); |
min_element | Поиск минимального элемента | auto it = std::min_element(v.begin(), v.end()); |
accumulate | Суммирование элементов диапазона | int sum = std::accumulate(v.begin(), v.end(), 0); |
transform | Применение функции к каждому элементу | std::transform(v.begin(), v.end(), v.begin(), f); |
Потоки ввода-вывода
| Объект / функция | Значение | Пример |
|---|---|---|
cin | Стандартный поток ввода | std::cin >> value; |
cout | Стандартный поток вывода | std::cout << "text"; |
cerr | Стандартный поток ошибок | std::cerr << "error"; |
getline | Чтение строки из потока | std::getline(std::cin, str); |
ifstream | Поток для чтения из файла | std::ifstream f("in.txt"); |
ofstream | Поток для записи в файл | std::ofstream f("out.txt"); |
stringstream | Поток для работы со строками | std::stringstream ss; ss << 42; |
Управление исключениями
| Конструкция | Значение | Пример |
|---|---|---|
try | Блок кода с возможными исключениями | try { /* ... */ } |
catch | Обработка перехваченного исключения | catch (const std::exception& e) { } |
throw | Генерация исключения | throw std::runtime_error("msg"); |
noexcept | Спецификатор отсутствия исключений | void f() noexcept { } |
Утилиты и вспомогательные функции
| Функция / шаблон | Значение | Пример |
|---|---|---|
auto | Автоматический вывод типа переменной | auto x = 42; |
nullptr | Типобезопасный нулевой указатель | int* p = nullptr; |
sizeof | Оператор определения размера в байтах | size_t s = sizeof(int); |
decltype | Вывод типа выражения | decltype(x) y = x; |
move | Превращение объекта в rvalue для перемещения | std::vector<int> v2 = std::move(v1); |
swap | Обмен значениями двух объектов | std::swap(a, b); |
make_unique | Создание умного указателя unique_ptr | auto p = std::make_unique<int>(42); |
make_shared | Создание умного указателя shared_ptr | auto p = std::make_shared<int>(42); |
Многопоточность и синхронизация
| Функция / класс | Значение | Пример |
|---|---|---|
thread | Создание и управление потоком выполнения | std::thread t(worker_function); |
join | Ожидание завершения потока | t.join(); |
detach | Отделение потока для независимого выполнения | t.detach(); |
mutex | Базовый мьютекс для защиты разделяемых данных | std::mutex m; m.lock(); |
lock_guard | RAII-обёртка для автоматической блокировки мьютекса | std::lock_guard<std::mutex> lock(m); |
unique_lock | Гибкая блокировка мьютекса с отложенной блокировкой | std::unique_lock<std::mutex> lock(m, std::defer_lock); |
condition_variable | Условная переменная для синхронизации потоков | cv.wait(lock, []{ return ready; }); |
notify_one | Пробуждение одного ожидающего потока | cv.notify_one(); |
notify_all | Пробуждение всех ожидающих потоков | cv.notify_all(); |
atomic | Атомарные операции без блокировок | std::atomic<int> counter(0); counter++; |
future | Получение результата асинхронной операции | std::future<int> f = std::async(task); |
promise | Установка значения для связанного future | std::promise<int> p; p.set_value(42); |
async | Запуск функции асинхронно | auto f = std::async(std::launch::async, calc); |
Работа со временем
| Функция / класс | Значение | Пример |
|---|---|---|
chrono::system_clock | Стенное время системы | auto now = std::chrono::system_clock::now(); |
chrono::steady_clock | Монотонные часы для измерения интервалов | auto start = std::chrono::steady_clock::now(); |
chrono::duration | Представление временного интервала | std::chrono::seconds s(5); |
chrono::time_point | Точка во времени | std::chrono::time_point tp = clock::now(); |
this_thread::sleep_for | Приостановка текущего потока на интервал | std::this_thread::sleep_for(100ms); |
this_thread::sleep_until | Приостановка до заданного момента времени | std::this_thread::sleep_until(wakeup_time); |
time_t | Тип для представления календарного времени | time_t t = time(nullptr); |
localtime | Преобразование time_t в локальное время | tm* lt = localtime(&t); |
gmtime | Преобразование time_t в время UTC | tm* utc = gmtime(&t); |
mktime | Преобразование структуры tm в time_t | time_t t = mktime(&tm_struct); |
Умные указатели
| Функция / класс | Значение | Пример |
|---|---|---|
unique_ptr | Уникальное владение объектом | std::unique_ptr<int> p(new int(42)); |
shared_ptr | Совместное владение с подсчётом ссылок | std::shared_ptr<int> p = std::make_shared<int>(42); |
weak_ptr | Ненаблюдательная ссылка на объект shared_ptr | std::weak_ptr<int> wp = sp; |
make_unique | Безопасное создание unique_ptr (C++14) | auto p = std::make_unique<MyClass>(); |
make_shared | Эффективное создание shared_ptr | auto p = std::make_shared<std::vector<int>>(10); |
reset | Освобождение управляемого объекта | p.reset(); |
get | Получение сылки на управляемый объект | int* raw = p.get(); |
use_count | Текущее количество владельцев shared_ptr | long n = sp.use_count(); |
expired | Проверка, указывает ли weak_ptr на живой объект | if (wp.expired()) { /* объект уничтожен */ } |
lock | Преобразование weak_ptr в shared_ptr | auto sp = wp.lock(); |
Функциональные объекты и утилиты
| Функция / класс | Значение | Пример |
|---|---|---|
function | Обобщённая обёртка для вызываемых объектов | std::function<int(int)> f = square; |
bind | Частичное применение аргументов функции | auto f = std::bind(add, _1, 10); |
ref | Обёртка для передачи аргумента по ссылке | std::ref(value) |
cref | Обёртка для передачи константной ссылки | std::cref(const_value) |
move | Приведение к rvalue для перемещения | std::move(obj) |
forward | Идеальная передача аргументов | std::forward<T>(arg) |
pair | Контейнер для двух значений | std::pair<int, string> p(42, "text"); |
make_pair | Создание пары без указания типов | auto p = std::make_pair(42, "text"); |
tuple | Контейнер для фиксированного числа значений | std::tuple<int, double, string> t(1, 2.0, "s"); |
get | Доступ к элементу кортежа по индексу | int x = std::get<0>(t); |
tie | Распаковка кортежа в отдельные переменные | std::tie(a, b) = get_values(); |
optional | Представление опционального значения (C++17) | std::optional<int> o = 42; |
nullopt | Отсутствие значения для optional | std::optional<int> empty = std::nullopt; |
variant | Типобезопасный объединённый тип (C++17) | std::variant<int, string> v = "text"; |
visit | Применение функции к значению variant | std::visit(visitor, v); |
Работа с файловой системой (C++17)
| Функция / класс | Значение | Пример |
|---|---|---|
filesystem::path | Представление пути к файлу или каталогу | std::filesystem::path p("/home/user"); |
exists | Проверка существования файла или каталога | if (std::filesystem::exists(p)) { } |
is_directory | Проверка, является ли путь каталогом | bool dir = std::filesystem::is_directory(p); |
is_regular_file | Проверка, является ли путь обычным файлом | bool file = std::filesystem::is_regular_file(p); |
create_directory | Создание каталога | std::filesystem::create_directory("new_dir"); |
remove | Удаление файла или пустого каталога | std::filesystem::remove("file.txt"); |
remove_all | Рекурсивное удаление каталога со всем содержимым | std::filesystem::remove_all("dir"); |
copy | Копирование файла или каталога | std::filesystem::copy(src, dst); |
rename | Переименование или перемещение файла | std::filesystem::rename(old, new); |
file_size | Получение размера файла в байтах | uintmax_t size = std::filesystem::file_size(p); |
current_path | Получение или установка текущего рабочего каталога | auto cwd = std::filesystem::current_path(); |
absolute | Преобразование пути в абсолютный | auto abs = std::filesystem::absolute(p); |
canonical | Получение канонического пути без символических ссылок | auto canon = std::filesystem::canonical(p); |
directory_iterator | Итератор по содержимому каталога | for (auto& e : std::filesystem::directory_iterator(".")) |
recursive_directory_iterator | Рекурсивный итератор по дереву каталогов | for (auto& e : std::filesystem::recursive_directory_iterator(".")) |
Исключения стандартной библиотеки
| Класс исключения | Значение | Пример перехвата |
|---|---|---|
exception | Базовый класс всех исключений | catch (const std::exception& e) |
logic_error | Ошибки логики программы | catch (const std::logic_error& e) |
invalid_argument | Передан недопустимый аргумент | throw std::invalid_argument("msg"); |
out_of_range | Выход за границы диапазона | throw std::out_of_range("index"); |
runtime_error | Ошибки времени выполнения | catch (const std::runtime_error& e) |
range_error | Ошибка диапазона числового значения | throw std::range_error("value"); |
overflow_error | Арифметическое переполнение | throw std::overflow_error("calc"); |
underflow_error | Арифметическое исчезновение порядка | throw std::underflow_error("calc"); |
bad_alloc | Неудачное выделение памяти | catch (const std::bad_alloc& e) |
bad_cast | Некорректное преобразование dynamic_cast | catch (const std::bad_cast& e) |
bad_typeid | Использование typeid с нулевым указателем | catch (const std::bad_typeid& e) |
bad_function_call | Вызов пустого std::function | catch (const std::bad_function_call& e) |
bad_weak_ptr | Создание shared_ptr из expired weak_ptr | catch (const std::bad_weak_ptr& e) |
system_error | Ошибки системного уровня | catch (const std::system_error& e) |
ios_base::failure | Ошибки потоков ввода-вывода | catch (const std::ios_base::failure& e) |
Локализация и локали
| Класс / функция | Значение | Пример |
|---|---|---|
locale | Представление локали для форматирования | std::locale loc("ru_RU.UTF-8"); |
imbue | Установка локали для потока | std::cout.imbue(loc); |
toupper | Преобразование символа в верхний регистр по локали | char c = std::toupper('a', loc); |
tolower | Преобразование символа в нижний регистр по локали | char c = std::tolower('A', loc); |
isdigit | Проверка цифрового символа по локали | bool d = std::isdigit('5', loc); |
numpunct | Фасет для форматирования чисел | std::numpunct<char> |
time_get | Фасет для разбора даты и времени | std::time_get<char> |
time_put | Фасет для форматирования даты и времени | std::time_put<char> |
codecvt | Преобразование между кодировками | std::codecvt_utf8<wchar_t> |